<?php

/**
 * Classe que representa o Usuário.
 * Os dados são conferidos do banco de dados e então aqui atualizados.
 * @author heekinho
 */
class User {
	var $database;

	// Dados do usuário
	var $userid = -1;
	var $username = 'guest';
	var $userlevel = '-1'; // [Aluno, Professor, Administrador] //TODO: Deixar no banco de dados.
	var $completename;
	var $cpf;
	var $email;
	
	var $status = "offline";
	var $sessid;


	/**
	 * Constrói um objeto que representa o usuário
	 * @author heekinho
	 * @param Mysql $database
	 * @return User
	 */
	public function User(&$database){
		$this->database = $database;
		$this->auto_login();
	}

	
	/**
	 * Processa o login e senha
	 * @author heekinho
	 * @param string $username
	 * @param string $password
	 * @return bool
	 */
	public function process_login($username, $password){
		global $C_INFOS; 	
		// Funções de Validação de Login
		$validation = true;
		
		// Se o campo username for vazio
		if(empty($username)){ 
			Info::queue_msg($C_INFOS['blank_field'], 'Usuário'); 
			$validation = false;
		}
		
		// Se o campo password for vazio
		if(empty($password)){
			Info::queue_msg($C_INFOS['blank_field'], 'Senha');  
			$validation = false;
		}
		
		// O campo username deve conter somente dados alfanuméricos ou underline
		$pattern = "[^a-zA-Z0-9_]";
		if(ereg($pattern, $username) && !empty($username)){ 
			Info::queue_msg($C_INFOS['invalid_chars'], 'Usuário');
			$validation = false; 
		}
		
		return $validation;
	}

	
	/**
	 * Ação de efetuar o login.
	 * @author heekinho
	 * @param string $username
	 * @param string $password
	 * @param bool $remind
	 * @return bool
	 */
	public function login($username, $password){
		global $C_LOGIN_INFOS;
		if($this->process_login($username, $password)){		
			// Obtem o password com criptografia e algum salt a ser adicionado.
			$password = $this->get_crypt_password($password);
			
			// Valida o usuário
			if($this->validate_user($username, $password)){
				$this->register_session();

				Info::queue_msg($C_LOGIN_INFOS['login_success'], $username);
				return true;
			}
			Info::queue_msg($C_LOGIN_INFOS['login_failure'], 'Senha');
		}
		return false;
	}

	
	/**
	 * Criptografa o password
	 * @author heekinho
	 * @param string $password
	 * @return string
	 */
	public function get_crypt_password($password){
		//TODO: Adicionar alguns níveis de 'salt'
		return md5($password);
	}

	
	/**
	 * Valida usuário, conferindo usuário e senha no banco de dados.
	 * @author heekinho
	 * @param string $username
	 * @param string $password
	 * @param int $userid
	 * @return true se autenticado.
	 */
	public function validate_user($username, $password, $userid = -1){
		if($userid == -1) $this->database->query("SELECT * FROM Usuario WHERE login='$username' AND senha='$password'");
		else $this->database->query("SELECT * FROM Usuario WHERE ID='$userid' AND login='$username' AND senha='$password'");

		if ($this->database->num_rows() == 1) {
			$this->update_info();
			return true;
		}
		return false;
	}


	/**
	 * Tenta logar o usuário baseado em informações de sessão.
	 * @author heekinho
	 * @return true se efetuado o logon
	 */
	private function auto_login(){
		if(!isset($_SESSION)) session_start();

		if($this->validate_session()){
			$this->status = 'online';
			return true;
		}

		$this->status = 'offline';
		return false;
	}

	/**
	 * Verifica se está definida as variáveis de sessão e recupera usuário do banco de dados.
	 * @author heekinho
	 * @return true se validada.
	 */
	private function validate_session(){
		if(!isset($_SESSION)) session_start();

		if(isset($_SESSION['s_userid'])){
			$my_userid = $_SESSION['s_userid'];
			$sql = "SELECT * FROM Usuario WHERE ID = '$my_userid'";

			$this->database->query($sql);
			if ($this->database->num_rows() == 1) {
				$this->update_info();
				return true;
			}
		}
		return false;
	}
	
	/**
	 * Atualiza as informações do usuário
	 * @author heekinho
	 */
	private function update_info(){
		$this->userid = $this->database->get('Usuario', 'ID');
		$this->username = $this->database->get('Usuario', 'login');
		$this->userlevel = $this->database->get('Usuario', 'TipoUsuario_ID');
		$this->completename = $this->database->get('Usuario', 'nome');
		$this->cpf = $this->database->get('Usuario', 'cpf');
		$this->email = $this->database->get('Usuario', 'email');
		
		$this->status = 'online';
	}
	
	
	/**
	 * Registra a sessão de usuário
	 * @author heekinho
	 */
	private function register_session(){
		$_SESSION['s_userid'] = $this->userid;
		$_SESSION['s_username'] = $this->username;
	}
	
	
	/**
	 * Efetua o logout do usuário no sistema.
	 * @author heekinho
	 */
	public function logout(){
		if(!isset($_SESSION)) session_start();
		session_destroy();
		$this->status = 'offline';
		global $C_LOGIN_INFOS; Info::queue_msg($C_LOGIN_INFOS['logout_success']);
	}

}

?>